// 版权归Epic Games, Inc.所有。保留所有权利。

#pragma once

#include "Engine/DataAsset.h"
#include "GameplayTagContainer.h"

#include "LyraInputConfig.generated.h"

class UInputAction;
class UObject;
struct FFrame;

/**
 * FLyraInputAction
 * 用于将输入动作映射到游戏玩法输入标签的结构体。
 */
USTRUCT(BlueprintType)
struct FLyraInputAction
{
	GENERATED_BODY()

public:

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TObjectPtr<const UInputAction> InputAction = nullptr; // 输入动作对象

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Meta = (Categories = "InputTag"))
	FGameplayTag InputTag; // 关联的游戏玩法标签
};

/**
 * ULyraInputConfig
 * 不可变的数据资产，包含输入配置属性。
 */
UCLASS(BlueprintType, Const)
class ULyraInputConfig : public UDataAsset
{
	GENERATED_BODY()

public:

	ULyraInputConfig(const FObjectInitializer& ObjectInitializer);

	/**
	 * 根据输入标签查找原生输入动作
	 * @param InputTag 要查找的输入标签
	 * @param bLogNotFound 是否在未找到时记录错误
	 * @return 找到的输入动作，未找到返回nullptr
	 */
	UFUNCTION(BlueprintCallable, Category = "Lyra|Pawn")
	const UInputAction* FindNativeInputActionForTag(const FGameplayTag& InputTag, bool bLogNotFound = true) const;

	/**
	 * 根据输入标签查找技能输入动作
	 * @param InputTag 要查找的输入标签
	 * @param bLogNotFound 是否在未找到时记录错误
	 * @return 找到的输入动作，未找到返回nullptr
	 */
	UFUNCTION(BlueprintCallable, Category = "Lyra|Pawn")
	const UInputAction* FindAbilityInputActionForTag(const FGameplayTag& InputTag, bool bLogNotFound = true) const;

public:
	// 所有者使用的输入动作列表。这些输入动作映射到游戏玩法标签，必须手动绑定。
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Meta = (TitleProperty = "InputAction"))
	TArray<FLyraInputAction> NativeInputActions; // 原生输入动作数组

	// 所有者使用的输入动作列表。这些输入动作映射到游戏玩法标签，并自动绑定到具有匹配输入标签的技能。
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Meta = (TitleProperty = "InputAction"))
	TArray<FLyraInputAction> AbilityInputActions; // 技能输入动作数组
};